﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AL100.Samples.Events.Implementation
{
    //STEP 1 :  Il nous faut déclarer un delegate qui va définir la 
    //          signature qu'auront les proc évènementielles qui 
    //          traiteront cet event.
    public delegate void NameChangedDelegate(object sender, PersonEventArgs e);
   
    public class Person
    {
        //STEP 2 :  Il faut maintenant déclarer que notre classe
        //          possède un event :
        // Syntaxe :    
        //          public event [TypeDelegate] NomEvenement.
        public event NameChangedDelegate NameChanged;

        // On utilise avantageusement le delegate générique EventHandler<TEventArgs>
        public event EventHandler<PersonEventArgs> NameChanged2;

        private string _name;


        /// <summary>
        /// Gets or sets the first name.
        /// </summary>
        public string FirstName { get; set; }

        /// <summary>
        /// Gets or sets the name.
        /// </summary>
        public string Name
        {
            get { return _name;         }
            set 
            {   
                _name = value;

                // STEP 3 : Il nous faut maintenant déclencher cet event, 
                //          mais au préalable, il nous faut nous assurer
                //          qu'il existe bien une (ou plusieurs) procédures
                //          abonnées à cet event, ce que l'on fait en comparant
                //          notre event à null.
                //          Si l'on déclenche l'event alors qu'il n'y a pas 
                //          de procédures abonnées, une exception sera levée.
                if (NameChanged != null)
                {
                    NameChanged(this, new PersonEventArgs(Name, FirstName));
                }
                if (NameChanged2 != null)
                {
                    NameChanged2(this, new PersonEventArgs(Name, FirstName));
                }

            }
        }

    }
}
